package ginlog

import (
	"gitee.com/wuzheng0709/backend-gopkg/infrastructure/pkg/gin/middleware"
	"github.com/gin-gonic/gin"
	"time"
)

func GinLogger() gin.HandlerFunc {
	return func(c *gin.Context) {
		// 开始时间
		start := time.Now()
		// 处理请求
		c.Next()
		// 结束时间
		end := time.Now()
		//执行时间
		latency := end.Sub(start)

		path := c.Request.URL.Path

		clientIP := middleware.GetRealIp(c)
		method := c.Request.Method
		statusCode := c.Writer.Status()
		logger.Infof("| %3d | %13v | %15s | %s  %s |",
			statusCode,
			latency,
			clientIP,
			method, path,
		)
	}
}

type InterfaceTransferLog struct {
	Status    int    `gorm:"column:status;type:int(3);not null;comment:'http状态码'" json:"status"`           // http状态码
	Method    string `gorm:"column:method;type:varchar(32);not null;comment:'http方法'" json:"method"`       // http方法
	Path      string `gorm:"column:path;type:varchar(255);not null;comment:'路径'" json:"path"`              // 路径
	Query     string `gorm:"column:query;type:varchar(255);not null;comment:'参数'" json:"query"`            // 参数
	IP        string `gorm:"column:ip;type:varchar(32);not null;comment:'用户IP'" json:"ip"`                 // 用户IP
	UserAgent string `gorm:"column:user_agent;type:varchar(255);not null;comment:'客户端'" json:"user_agent"` // 客户端
	Errors    string `gorm:"column:errors;type:text;not null;comment:'错误信息'" json:"errors"`                // 错误信息
	Latency   int    `gorm:"column:latency;type:int(32);not null;comment:'延迟（单位：毫秒）'" json:"latency"`      // 延迟（单位：毫秒）
	UserID    int64  `gorm:"column:user_id;type:bigint(10);not null;comment:'用户id'" json:"user_id"`        // 用户id
	RealName  string `gorm:"column:real_name;type:varchar(64);not null;comment:'真实姓名'" json:"real_name"`   // 真实姓名
	Username  string `gorm:"column:username;type:varchar(32);not null;comment:'用户名'" json:"username"`      // 用户名
	Param     string `gorm:"column:param;type:text;default:null;comment:'请求body信息'" json:"param"`          // 请求body信息
	ResBody   string `gorm:"column:res_body;type:text;default:null;comment:'请求body信息'" json:"res_body"`    // 请求body信息
	LogType   string `json:"log_type"`                                                                     // 日志类型
}

//func GinLoggerV2() gin.HandlerFunc {
//	return func(c *gin.Context) {
//		start := time.Now()
//		path := c.Request.URL.Path
//		query := c.Request.URL.RawQuery
//		reqBodyByte, _ := io.ReadAll(c.Request.Body)
//		c.Request.Body = io.NopCloser(bytes.NewBuffer(reqBodyByte))
//		token := c.Request.Header.Get("token")
//		logDb := InterfaceTransferLog{}
//		customClaims, _ := jwt.ParseToken(token)
//		if customClaims == nil {
//			logDb.UserID = 0
//		} else {
//			logDb.UserID = toolfunc.String2Int64(customClaims.UID)
//		}
//		var user entity.UserInfo
//		user.UserID = logDb.UserID
//		if logDb.UserID != 0 {
//			orm.GetMysqlDB().Model(entity.UserInfo{}).Where("user_id = ?", logDb.UserID).First(&user)
//			c.Header("UserName", user.Username)
//			c.Header("RealName", user.RealName)
//			c.Header("UserId", strconv.FormatInt(user.UserID, 10))
//		}
//
//		// 设置相关变量
//		c.Set(USER_REALNAME_KEY, user.RealName)
//		c.Set(USER_USERNAME_KEY, user.Username)
//		c.Set("ecmAccount", user.Username)
//		if user.Usertype != 1 {
//			c.Set("ecmAccount", "hpdiFile")
//		}
//
//		//logger := zap.L()
//		resWrrite := PrintResponse(c)
//		c.Next()
//		if path != "/" {
//
//			// 生成的日志信息
//			latency := time.Since(start)
//			//logger.Info(path,
//			//	zap.Int("status", c.Writer.Status()),
//			//	zap.String("method", c.Request.Method),
//			//	zap.String("path", path),
//			//	zap.String("query", query),
//			//	zap.String("ip", c.Request.Header.Get("X-Real-IP")),
//			//	zap.String("user-agent", c.Request.UserAgent()),
//			//	zap.String("errors", c.Errors.ByType(gin.ErrorTypePrivate).String()),
//			//	zap.Duration("latency", latency),
//			//)
//
//			// 写入数据库中
//			logDb.Status = c.Writer.Status()
//			logDb.Method = c.Request.Method
//			logDb.Path = path
//			logDb.Query = query
//			logDb.IP = c.Request.Header.Get("X-Real-IP")
//			logDb.UserAgent = c.Request.UserAgent()
//			logDb.Errors = c.Errors.ByType(gin.ErrorTypePrivate).String()
//			logDb.Latency = int(latency.Milliseconds())
//			logDb.Username = user.Username
//			logDb.RealName = user.RealName
//			logDb.Param = string(reqBodyByte)
//			logDb.ResBody = resWrrite.b.String()
//
//			//if err := orm.GetMysqlDB().Create(&logDb).Error; err != nil {
//			//	logger.Error("上条日志写入数据库失败:，报错信息为：" + err.Error())
//			//}
//			//log.Info(logDb)
//			logDbByte, _ := json.Marshal(logDb)
//			log.Info(string(logDbByte))
//		}
//	}
//}
